﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class AnimationBesetzung
    Inherits ObjektAnimation
    Const FrameStart As Integer = 14
    Const FrameBesetzt As Integer = 25
    Dim FrameEnde As Integer = 29

    Dim EinBesetzungspunnktHoehe As Single = 3.3#
    Dim GebaeudeTextur As Texture
    Dim GebaeudeTextur2 As Texture
    Dim Infi As Texture
    Dim BesAlt As Integer = 20
    Dim BesNeu As Integer = 20
    Dim Aenderung As Integer = 0
    Dim Frame2 As Integer
    Dim Besetzt As Boolean = False
    Dim StartY As Integer = 0
    Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Musikspielen As Boolean, ByVal Schlacht As Integer)
        MyBase.New(False, Schlacht)
        BildID = MyBase.LoadTextur("Capturing\Besetzungshintergrund", 0)

        MyBase.P = New PointF(CSng(X), Y - 1)

        InFeldern = True

        Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)
        If Einheit Is Nothing Then
            Einheit = Objektverwalter.Spielfeld.AktuelleEinheit
        End If
        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
        'Frames berechnen
        Dim E As Integer = Einheit.getKP
        If E > G.Besetzung Then
            E = G.Besetzung
        End If
        FrameEnde = 14 + 15 * (E / 10)

        If G.Angriff = ObjektGebaeude.Angriffe.HQ Then
            'Das HQ ist 15 hoeher als andere Besetzungen.
            EinBesetzungspunnktHoehe = (66) / 20
            StartY = 15
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + "+" + G.GetSpieler.Armee + ".png") Then
                GebaeudeTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + "+" + G.GetSpieler.Armee + ".png"), Hauptmenue.Farbtabelleerstellen(G.GetSpieler.Farbe))
            Else
                GebaeudeTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\HQ+OS.png"), Hauptmenue.Farbtabelleerstellen(G.GetSpieler.Farbe))
            End If
        Else
            EinBesetzungspunnktHoehe = 66 / 20
            If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + ".png") Then
                GebaeudeTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + ".png"), Hauptmenue.Farbtabelleerstellen(G.GetSpieler.Farbe))
            Else
                GebaeudeTextur = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\STADT.png"), Hauptmenue.Farbtabelleerstellen(G.GetSpieler.Farbe))
            End If
        End If
        If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Animations\Capturing\SOLDAT+" + GetArmyOutFit(Einheit.GetSpieler.Armee) + ".png") Then
            Infi = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\SOLDAT+" + GetArmyOutFit(Einheit.GetSpieler.Armee) + ".png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
        Else
            Infi = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\SOLDAT+OS.png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
        End If
        'wir holen die Besetzungszahl
        Dim Aenderung As Integer = Einheit.getKP
        Dim Bonus As Single = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).Besetzer

        If Bonus <> 0 Then
            Dim BoostMode As Single = Einheit.GetSpieler.KOS(0).GetKOZoneBoost(Einheit)
            If BoostMode = 0 Then
                Bonus = 0
            Else
                Dim Bonus2 As Single = Math.Round(Bonus)
                If Objektverwalter.Spielfeld.Regeln.KOSystem > KOSysteme.Gabe_Modus Then
                    'Wir schaue ob Addiert oder multipliziert werden soll
                    If Bonus2 = Bonus Then
                        Bonus = 1 + Math.DivRem(CInt(Bonus - 1), CInt(1 / BoostMode), 0)
                    Else
                        Bonus *= BoostMode
                    End If
                Else
                    'Wir schaue ob Addiert oder multipliziert werden soll
                    If Bonus2 = Bonus Then
                        Bonus = CInt(Bonus)
                    End If
                End If
            End If
        End If


        If Not Bonus = 0 Then
            Dim Bonus2 As Single = Math.Round(Bonus)
            'Wir schaue ob Addiert oder multipliziert werden soll
            If Bonus2 = Bonus Then
                Aenderung += Bonus
            Else
                Aenderung *= Bonus
            End If
        End If
        Aenderung += Einheit.BesetzungsBonus

        Dim Bonussenkung As Integer = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GetBonusgebaeude(X, Y)
        If Bonussenkung >= 0 Then
            Aenderung -= Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BonusGebaeude(Bonussenkung).Z
            Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).RemoveBonusGebaeude(Bonussenkung)
        End If
        'wir besetzen
        BesAlt = G.Besetzung
        If Aenderung > BesAlt Then Aenderung = BesAlt
        G.Besetzung = BesAlt - Aenderung
        Me.Aenderung = Aenderung

        BesNeu = G.Besetzung
        If G.Besetzung <= 0 Then
            If G.Angriff = ObjektGebaeude.Angriffe.HQ Then
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + "+" + Einheit.GetSpieler.Armee + ".png") Then
                    GebaeudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + "+" + Einheit.GetSpieler.Armee + ".png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                Else
                    GebaeudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\HQ+OS.png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                End If
            Else
                If My.Computer.FileSystem.FileExists(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + ".png") Then
                    GebaeudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\" + G.GebaeudeID + ".png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                Else
                    GebaeudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(DataSettings.Resourcenpfad + "Animations\Capturing\STADT.png"), Hauptmenue.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                End If
            End If
            Besetzt = True
            Einheit.Besetzen = False
            G.Besetzung = ObjektGebaeude.Besetzungszahl
            Select Case G.Angriff

                Case ObjektGebaeude.Angriffe.HQ
                    If G.Spieler > 0 Then
                        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(G.Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQVerlust)
                    End If
                    Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Einheit.Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQEroberung)
            End Select
            G.Spieler = Einheit.Spieler
            G.getBildID(Nothing)
        End If
        ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
        'Event Handling hinzufuegen
    End Sub

    Public Overrides Function Malen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0, Optional ByVal Feldbreite As Integer = -1) As Boolean
        If DataSettings.draw3D Then
        ElseIf DataSettings._2D_3D_Malen Then
            _2D3DMalen(intColor, Zoomfaktor)
        Else
            _2DMalen(intColor, Zoomfaktor)
        End If
        Frame2 += 1
        If Besetzt Then
            If Frame2 > FrameEnde + FrameBesetzt Then
                ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
                Return False
            Else
                Return True
            End If
        Else
            If Frame2 > FrameEnde Then

                ObjektScript.Pruefen(ObjektScript.Pruefstadien.RundenMitte)
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
                Return False
            Else
                Return True
            End If
        End If
    End Function
    Private Sub _2DMalen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0)
        MyBase.Malen(intColor, Zoomfaktor)
        Dim sngRotation As Double = 0
        Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
        Grafikengine.recBild = Nothing
        If Frame2 < FrameEnde Then

            'Das Gebaeude schrumpft
            Dim Frame3 As Integer = Frame2 - FrameStart
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 10 Then Frame3 = 10

            Dim BesMom As Single = BesAlt - Frame3 * Aenderung / 10

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - 36 + (BesAlt - BesMom) * EinBesetzungspunnktHoehe + (20 - BesAlt) * EinBesetzungspunnktHoehe)
            With Grafikengine.szfScale
                .Width = 41
                .Height = 66 - (BesAlt - BesMom) * EinBesetzungspunnktHoehe - (20 - BesAlt) * EinBesetzungspunnktHoehe
            End With
            Grafikengine.Sprite.Draw2D(GebaeudeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            'Der Infi wird gemalt.
            Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
            If Frame2 < 10 Then
                Math.DivRem(Frame2, 6, Frame3)
                If Frame3 > 4 Then
                    Frame3 = 2
                ElseIf Frame3 > 2 Then
                    Frame3 = 1
                Else
                    Frame3 = 0
                End If
            Else
                Frame3 = 0
            End If
            Grafikengine.ptfPosition.Y -= ((BesAlt - BesMom) + (20 - BesAlt) + 4)
            With Grafikengine.recBild
                .X = Hauptmenue.FeldbreiteKlein * Frame3 : .Width = Hauptmenue.FeldbreiteKlein
                .Y = 0 : .Height = Hauptmenue.FeldbreiteKlein * 1.5#
            End With
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfPosition.Y -= StartY * (BesMom / 20)
            Grafikengine.ptfPosition.X += 10
            Grafikengine.Sprite.Draw2D(Infi, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        ElseIf Besetzt = True Then
            If Frame2 = FrameEnde Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Erobert.wav", False)
            End If
            Dim Frame3 As Integer = Frame2 - FrameEnde
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 20 Then Frame3 = 20

            Dim BesMom As Single = Frame3

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - 36 + (20 - BesMom) * EinBesetzungspunnktHoehe)
            With Grafikengine.szfScale
                .Width = 41
                .Height = BesMom * EinBesetzungspunnktHoehe
            End With
            Grafikengine.Sprite.Draw2D(GebaeudeTextur2, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            'Der Infi wird gemalt.
            Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
            If Frame3 < 3 Then
                Frame3 = 3
            Else
                Frame3 = 4
            End If
            Grafikengine.ptfPosition.Y -= ((20 - BesMom) + 4)
            With Grafikengine.recBild
                .X = Hauptmenue.FeldbreiteKlein * Frame3 : .Width = Hauptmenue.FeldbreiteKlein
                .Y = 0 : .Height = Hauptmenue.FeldbreiteKlein * 1.5#
            End With
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfPosition.Y -= StartY * (BesMom / 20)
            Grafikengine.ptfPosition.X += 10
            Grafikengine.Sprite.Draw2D(Infi, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If
    End Sub
    Private Sub _2D3DMalen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0)
        Dim Feldbreite As Integer = Hauptmenue.FeldbreiteKlein
        MyBase.Malen(intColor, Zoomfaktor, Feldbreite)

        If Frame2 < FrameEnde Then
            'Das Gebaeude schrumpft :(
            Dim Frame3 As Integer = Frame2 - FrameStart
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 10 Then Frame3 = 10

            Dim BesMom As Single = BesAlt - Frame3 * Aenderung / 10
            Dim T As Textur = Texturen(BildID)
            Dim MittelPunkt As New PointF(T.EinzelbildGroesse.Width / 2, T.EinzelbildGroesse.Height / 2)


            Dim XPlus As Single = -MittelPunkt.X / Feldbreite
            Dim YPlus As Single = -(T.EinzelbildGroesse.Height - MittelPunkt.Y) / Feldbreite
            Dim Vec As Vector3
            Dim cube(3) As CustomVertex.PositionTextured
            Vec = ObjektSpielfeld.CalcDraw2D3DVec(CSng(P.X) + XPlus + 0.5, ObjektSpielfeld.SpielfeldLayer.Animationen, CSng(P.Y) - YPlus - 0.5)
            Dim Hoehe As Single = (66 - (BesAlt - BesMom) * EinBesetzungspunnktHoehe - (20 - BesAlt) * EinBesetzungspunnktHoehe) / Feldbreite

            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, 0, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, Hoehe, 0, 0)
            cube(2) = New CustomVertex.PositionTextured(41 / Feldbreite, 0, 0, 1, 1)
            cube(3) = New CustomVertex.PositionTextured(41 / Feldbreite, 0, Hoehe, 1, 0)
            Grafikengine.malen2Din3D(Vec, cube, GebaeudeTextur, intColor)
            'Infi malen :)
            MittelPunkt = New PointF(41 / 2, 0)
            XPlus = -MittelPunkt.X / Feldbreite
            If Frame2 < 10 Then
                Math.DivRem(Frame2, 6, Frame3)
                If Frame3 > 4 Then
                    Frame3 = 2
                ElseIf Frame3 > 2 Then
                    Frame3 = 1
                Else
                    Frame3 = 0
                End If
            Else
                Frame3 = 0
            End If
            Vec.Z += Hoehe - (20 - StartY) * (BesMom / 20) / Feldbreite
            Vec.X = CSng(P.X) + XPlus + 0.5 + 10 / Feldbreite
            Vec.Y = ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Animationen, -Vec.Z + 5)
            Dim FrameSize As Single = 1 / 5
            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, FrameSize * Frame3, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, 1.5, FrameSize * Frame3, 0)
            cube(2) = New CustomVertex.PositionTextured(1, 0, 0, FrameSize * Frame3 + FrameSize, 1)
            cube(3) = New CustomVertex.PositionTextured(1, 0, 1.5, FrameSize * Frame3 + FrameSize, 0)
            Grafikengine.malen2Din3D(Vec, cube, Infi, intColor)

        ElseIf Besetzt = True Then
            If Frame2 = FrameEnde Then
                MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Overworld\Erobert.wav", False)
            End If
            'Das Gebaeude geht wieder hoch.
            Dim Frame3 As Integer = Frame2 - FrameEnde
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 20 Then Frame3 = 20
            Dim BesMom As Single = Frame3
            Dim T As Textur = Texturen(BildID)
            Dim MittelPunkt As New PointF(T.EinzelbildGroesse.Width / 2, T.EinzelbildGroesse.Height / 2)
            Dim XPlus As Single = -MittelPunkt.X / Feldbreite
            Dim YPlus As Single = -(T.EinzelbildGroesse.Height - MittelPunkt.Y) / Feldbreite
            Dim Vec As Vector3
            Dim cube(3) As CustomVertex.PositionTextured
            Vec = ObjektSpielfeld.CalcDraw2D3DVec(CSng(P.X) + XPlus + 0.5, ObjektSpielfeld.SpielfeldLayer.Animationen, CSng(P.Y) - YPlus - 0.5)
            Dim Hoehe As Single = BesMom * EinBesetzungspunnktHoehe / Feldbreite
            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, 0, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, Hoehe, 0, 0)
            cube(2) = New CustomVertex.PositionTextured(41 / Feldbreite, 0, 0, 1, 1)
            cube(3) = New CustomVertex.PositionTextured(41 / Feldbreite, 0, Hoehe, 1, 0)
            Grafikengine.malen2Din3D(Vec, cube, GebaeudeTextur2, intColor)
            'Der Infi wird gemalt.
            MittelPunkt = New PointF(41 / 2, 0)
            XPlus = -MittelPunkt.X / Feldbreite
            If Frame3 < 3 Then
                Frame3 = 3
            Else
                Frame3 = 4
            End If
            Vec.Z += Hoehe - (20 - StartY) * (BesMom / 20) / Feldbreite
            Vec.X = CSng(P.X) + XPlus + 0.5 + 10 / Feldbreite
            Vec.Y = ObjektSpielfeld.GetLayerHoehe(ObjektSpielfeld.SpielfeldLayer.Animationen, -Vec.Z + 5)
            Dim FrameSize As Single = 1 / 5
            cube(0) = New CustomVertex.PositionTextured(0, 0, 0, FrameSize * Frame3, 1)
            cube(1) = New CustomVertex.PositionTextured(0, 0, 1.5, FrameSize * Frame3, 0)
            cube(2) = New CustomVertex.PositionTextured(1, 0, 0, FrameSize * Frame3 + FrameSize, 1)
            cube(3) = New CustomVertex.PositionTextured(1, 0, 1.5, FrameSize * Frame3 + FrameSize, 0)
            Grafikengine.malen2Din3D(Vec, cube, Infi, intColor)
        End If
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case MouseButtons.Right
                Frame2 = FrameEnde + FrameBesetzt + 1
        End Select
    End Sub
    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case DataSettings.Abrechen
                Frame2 = FrameEnde + FrameBesetzt + 1
        End Select
    End Sub
    Public Overrides Sub RemoveHandles()
        MyBase.RemoveHandles()
        GebaeudeTextur.Dispose()
        GebaeudeTextur = Nothing
        If Not GebaeudeTextur2 Is Nothing Then
            GebaeudeTextur2.Dispose()
            GebaeudeTextur2 = Nothing
        End If
        Infi.Dispose()
        Infi = Nothing
        Grafikengine.Grafikkarte.EvictManagedResources()
    End Sub
End Class
